#ifndef __TCPCONNECTION_HPP__
#define __TCPCONNECTION_HPP__

#include "Socket.hpp"
#include "SocketIO.hpp"
#include "InetAddress.hpp"
#include <memory>
#include <functional>

typedef shared_ptr<TcpConnection> TcpConnectionPtr;

class TcpConnection : public enable_shared_from_this<TcpConnection> 
{
    typedef function<void(const TcpConnectionPtr& conn)> TcpConnectionCallback;

public:
    TcpConnection(int sockfd); // Constructor
    ~TcpConnection(); // Constructor
    std::string receive(); // 接收数据
    void send(const std::string& msg); // 发送数据
    void sendInLoop(const std::string& msg); // 将数据交给IO线程发送
    void sendAndClose(const std::string& msg); // 发送数据，并关闭连接，针对网页服务
    void shutdown(); // 关闭连接
    void setConnectionCallback(TcpConnectionCallback cb); // 设置回调函数
    void setMessageCallback(TcpConnectionCallback cb); // 设置回调函数
    void setCloseCallback(TcpConnectionCallback cb); // 设置回调函数
    void handleConnectionCallback(); // 调用相应的回调函数
    void handleMessageCallback(); // 调用相应的回调函数
    void handleCloseCallback(); // 调用相应的回调函数
    std::string toString(); // 返回连接的字符串表示
private:
    Socket _sockfd;
    SocketIO _sockIO;
    const InetAddress _localAddr;
    const InetAddress _peerAddr;
    bool _isShutdownWrite;
    EpollPoller* _loop; // 保存EpollPoller对象的指针
    typedef function<void(const TcpConnectionPtr&)> TcpConnectionCallback;
    TcpConnectionCallback _onConnectionCb;
    TcpConnectionCallback _onMessageCb;
    TcpConnectionCallback _onCloseCb;
};

#endif